package com.example.terminalservice.controller;

import com.example.terminalservice.common.MenuTypeEnum;
import com.example.terminalservice.common.Result;
import com.example.terminalservice.pojo.Menu;
import com.example.terminalservice.service.MenuService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author 28142
 * @description MenuController
 * @date 2023/8/5 13:36
 */
@RestController
@RequestMapping("/menu")
@Api(tags = "菜单管理")
public class MenuController {
    @Autowired
    private MenuService menuService;

    /**
     * 查询所有菜单，在分配菜单（权限）时，需要获取所有菜单，所以加上权限sys:role:menu
     * @author 杨雨盛
     * @date 2023/8/5 20:28
     * @return com.example.terminalservice.common.Result
     */
    @ApiOperation("查询所有菜单")
    @GetMapping
    @PreAuthorize("hasAnyAuthority('sys:menu', 'sys:role:menu')")
    public Result findAll() {
        return menuService.findAll();
    }

    /**
     * 根据角色查询对应菜单列表，只有在分配权限时才需要根据角色获取对应权限，因此加上权限控制sys:role:menu
     * @author 杨雨盛
     * @date 2023/8/5 20:29
     * @param roleId
     * @return com.example.terminalservice.common.Result
     */
    @ApiOperation("根据角色查询对应菜单列表")
    @GetMapping("/{roleId}")
    @PreAuthorize("hasAnyAuthority('sys:role:menu')")
    public Result getMenusByRole(@PathVariable Integer roleId) {
        return menuService.getMenusByRole(roleId);
    }

    /**
     * 给角色分配菜单
     * @author 杨雨盛
     * @date 2023/8/5 21:19
     * @param roleId
     * @param ids
     * @return com.example.terminalservice.common.Result
     */
    @ApiOperation("给角色分配菜单")
    @PutMapping("/{roleId}")
    @PreAuthorize("hasAnyAuthority('sys:role:menu')")
    public Result setMenusByRole(@PathVariable Integer roleId,
                                 @RequestParam List<Integer> ids) {
        return menuService.setMenusByRole(roleId, ids) ? Result.success() : Result.error();
    }

    /**
     * 根据类型查询上一级菜单列表，新增或修改菜单时，都需要获取上一级菜单集合
     * @author 杨雨盛
     * @date 2023/8/7 9:36
     * @param type
     * @return com.example.terminalservice.common.Result
     */
    @ApiOperation("根据类型查询上一级菜单列表")
    @GetMapping("/type/{type}")
    @PreAuthorize("hasAnyAuthority('sys:menu:add', 'sys:menu:update')")
    public Result getParent(@PathVariable Integer type) {
        return menuService.getParent(type);
    }

    @PostMapping
    @PreAuthorize("hasAnyAuthority('sys:menu:add', 'sys:menu:update')")
    public Result saveMenu(@RequestBody Menu menu) {
        /*
        首先选择要添加的menu类型，判断是目录、菜单还是按钮
        如果是目录，直接填写信息；
        如果是菜单，要先选择它的父级目录；
        如果是按钮，要先选择它的父级菜单
        填写，提交
        修改菜单，传入id
        */
        return menuService.saveOrUpdate(menu) ? Result.success() : Result.error();
    }

    /**
     * 如果类型为按钮，直接删除否则需要级联删除
     * @author 杨雨盛
     * @date 2023/8/7 10:26
     * @param id
     * @param type
     * @return com.example.terminalservice.common.Result
     */
    @ApiOperation(value = "删除", notes = "如果类型为按钮，直接删除否则需要级联删除")
    @DeleteMapping("/{id}/{type}")
    @PreAuthorize("hasAnyAuthority('sys:menu:del')")
    public Result delMenu(@PathVariable Integer id,
                          @PathVariable Integer type) {
        return menuService.delMenu(id, type) ? Result.success() : Result.error();
    }
}
